#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by master on 2017/2/26

'''
    开闭原则：
        已经实现的功能的代码不允许被修改，但是可以被扩展，即：
        封闭：已实现的功能代码块
        开放：可以对功能进行扩展
'''

'''
# v1.0
def login(func):
    print("passed user verification。。。")
    return func  # 函数后面加括号就是调用
    # 不加括号就是返回函数的内存地址
    # 就是把函数读进内存 等待调用


def home(name):
    print("Welcome [%s] to home page" % name)


def tv(name):
# def tv():
    print("Welcome [%s] to TV page" % name)
    # print("Welcome to TV page")


def movie(name):
    print("Welcome [%s] to movie page" % name)


tv = login(tv)
tv("alex")
'''

'''

# v2.0
def login(func):
    def inner(name):
        print("passed user verification。。。")
        func(name)

    return inner  # 函数后面加括号就是调用
    # 不加括号就是返回函数的内存地址
    # 就是把函数读进内存 等待调用

@login
def home(name):
    print("Welcome [%s] to home page" % name)


# 装饰器(先执行login)
@login  # 程序一启动就会执行
def tv(name):
    print("Welcome [%s] to TV page" % name)

@login
def movie(name):
    print("Welcome [%s] to movie page" % name)


tv("alex")
'''

'''
# v3.0
# 多参
def login(func):
    def inner(*args, **kwargs):
        print("passed user verification。。。")
        return func(*args, **kwargs)

    return inner  # 函数后面加括号就是调用
    # 不加括号就是返回函数的内存地址
    # 就是把函数读进内存 等待调用


@login
def home(name):
    print("Welcome [%s] to home page" % name)


# 装饰器(先执行login)
@login  # 程序一启动就会执行
def tv(*args, **kwargs):
    print("Welcome [%s] to TV page" % args)
    return True


@login
def movie(name):
    print("Welcome [%s] to movie page" % name)


print(tv("alex", password="123"))
movie("alex")


'''


# v4.0 带参数的装饰器
def before(request, kargs):
    print("before")


def after(request, kargs):
    print("after")


def filter(before_func, after_func):  # 最外层为了接收两个参数
    def outer(main_func):
        def warpper(request, kargs):

            # 主函数之前的处理
            before_result = before_func(request, kargs)
            if (before_result != None):  # 如果验证不成功 就return(程序退出 before函数没有返回值，所以如果返回值不为None的话就是验证没有通过)
                return before_result

            main_result = main_func(request, kargs)  # 同上 出错就return
            if (main_result != None):
                return main_result
            # 主函数之后的处理
            after_result = after_func(request, kargs)
            if (after_result != None):
                return after_result

        return warpper

    return outer


@filter(before, after)
def index(request, kargs):
    print("index")


index("req", "arg")
